package com.xjggb.链表;

public class SingleLinkedList<E> extends com.xjggb.链表.AbstractList<E> {

//    定义头结点
    private  Node<E> first;

    private static class Node<E> {
        E element;
        Node<E> next;
        public Node(E element, Node<E> next) {
            this.element = element;
            this.next = next;
        }
    }


    public void clear() {
        size=0;
        first=null;  //头结点不指向任何结点就表示链表为空

    }

    public E get(int index) {
        return node(index).element;
    }

    public E set(int index, E element) {

//        根据index获取当前节点
        Node<E> node = node(index);
//        获取当前修改的元素
        E element1 = node.element;
//        修改元素
        node.element=element;
//返回修改元素
        return element1;
    }

//    添加节点
    public void add(int index, E element) {
//        检查传入的index是否合法
        rangeCheckForAdd(index);
        if (index==0){
            first=new Node<E>(element,first);
        }else {
//            根据索引获取上一个节点
            Node<E> node = node(index - 1);
                    /*
                    *  创建新节点->(括号里面的是node.next是下一节点的Node)，
                    *   node.next 将新的节点赋值到
                     * */
             node.next = new Node<E>(element,node.next);
        }
        size++;


    }

    /*
    * 删除节点
    * */
    public E remove(int index) {
        rangeCheck(index);

        Node<E> prev = index == 0 ? first : node(index - 1);
        Node<E> node = prev.next;
        prev.next = node.next;
        size--;
        return node.element;
////        定义一个节点
//        Node<E> node = first;
//        if (index==0){
//            first=first.next;
//        }else {
////            获取拿到上一个节点
//            Node<E> prev = node(index - 1);
////            获取上一节点指向的node
//            node= prev.next;
////            获取下一节点
//            prev.next =node.next;
//        }
//        size--;
//        return node.element;
    }

    public int indexOf(E element) {
        if (element == null) {
            Node<E> node = first;
            for (int i = 0; i < size; i++) {
                if (node.element == null) return i;

                node = node.next;
            }
        } else {
            Node<E> node = first;
            for (int i = 0; i < size; i++) {
                if (element.equals(node.element)) return i;
                node = node.next;
            }
        }
        return ELEMENT_NOT_FOUND;
    }
//    根据index位置获取对应的结点对象
    private  Node<E> node(int index){
//根据传入索引判断是否合法
        rangeCheck(index);
//        根据头结点获取下一节点数据
        Node<E> node = first;

        for (int i = 0; i < index; i++) {
//            当前的node结点指向下一个node结点
            node = node.next;
        }
        return node;
    }

    @Override
    public String toString() {
        StringBuilder string = new StringBuilder();
        string.append("size=").append(size).append(", [");
        Node<E> node = first;
        for (int i = 0; i < size; i++) {
            if (i != 0) {
                string.append(", ");
            }
            string.append(node.element);
            node = node.next;
        }
        string.append("]");
        return string.toString();
    }
}
